package reader;


import data.handle.PackMessage;
import instance.LocalInstance;

import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

public class PartAndLineItemHandler implements Handler {
    private static int handleThreadNum;//本地负责对解析出的数据进行处理的线程数，每个线程负责处理一段范围的零件号。
    private static int partKeyNum;//每个数据处理线程需要处理的零件号的数量
    private static int fileReaderThreadNum;//负责读取文件的线程的数量
    private static int instanceId;//当前实例的序号

    //初始化处理器
    public static void init(int id){
        instanceId = id;
        try {
            //从资源文件中获取数据
            InputStream is = PartAndLineItemHandler.class.getClassLoader().getResourceAsStream("address.properties");
            Properties properties = new Properties();
            properties.load(is);
            handleThreadNum = Integer.parseInt(properties.getProperty("handleThreadNum"));
            partKeyNum = 2000000 / (handleThreadNum * 4);
            fileReaderThreadNum = Integer.parseInt(properties.getProperty("fileReaderThreadNum"));

            //开启本地数据接收和处理的线程
            LocalInstance.startLocalThreads(handleThreadNum, fileReaderThreadNum);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public PartAndLineItemHandler(int num) {
        fileReaderThreadNum = num;
    }


    @Override
    public void localHandle(PackMessage packMessage, int index, int fileIndex) {
        //将数据包交给本地处理实例进行处理
        LocalInstance.addData(packMessage, index, fileIndex);
    }

    @Override
    public void localFile1End(){
        for (int i = 0; i < handleThreadNum; i++) {
            PackMessage packMessage = new PackMessage();
            packMessage.setEndFlag(true);//封装part表读取结束的标志
            LocalInstance.addData(packMessage, i, 0);
        }

        System.out.println("localFile1End");
    }



    @Override
    public void localFile2End(){
        for (int i = 0; i < handleThreadNum; i++) {
            PackMessage packMessage = new PackMessage();
            packMessage.setEndFlag(true);//封装lineItem表读取结束的标志
            LocalInstance.addData(packMessage, i, 1);
        }
        System.out.println("localFile2End");
    }


    /*
     * @Description: 计算该零件号属于哪个分段（根据零件号范围分片，每个实例负责处理某几个分段的零件号，一个分段一个线程处理）
     * @param partKey : 零件号
     * @return: {@link int} 零件号的分段序号
     * @author: xff
     * @Date: 2022/7/5
     */
    public static int getIndex(int partKey){
        return (partKey - 1) / partKeyNum;
    }

    /*
     * @Description: 判断一个分段序号是否是在本实例处理
     * @param index : 零件号的分段序号
     * @return: {@link boolean}
     * @author: xff
     * @Date: 2022/7/5
     */
    public static boolean isLocalHandle(int index){
        return index >= instanceId * handleThreadNum && index < instanceId * handleThreadNum + handleThreadNum;
    }

    /*
     * @Description: 如果零件号的分段序号是本实例负责处理，会根据分段序号计算出数据处理线程的序号
     * @param index : 零件号的分段序号
     * @return: {@link int} 数据处理线程的序号
     * @author: xff
     * @Date: 2022/7/5
     */
    public static int getLocalIndex(int index){
        return isLocalHandle(index) ? index - instanceId * handleThreadNum : -1;
    }
}
